home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / EDITOREN / 7UP_PD / TOOLBAR.C < prev    next >
C/C++ Source or Header  |  1998-03-14  |  12KB  |  484 lines

  1. /* Fenster Toolbar */
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                      Modul: TOOLBAR.C
  6. *                                     (c) by TheoSoft '93
  7. *
  8. *****************************************************************************/
  9. #include <portab.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include <aes.h>
  14. #include <vdi.h>
  15.  
  16. #include "windows.h"
  17. #include "7up.h"
  18.  
  19. #include "alert.h"
  20. #include "toolbar.h"
  21.  
  22. #define FLAGS9  0x0200
  23. #define FLAGS10 0x0400
  24.  
  25. extern WINDOW *twp;
  26.  
  27. int tabbar = TRUE;
  28.  
  29. int _wind_get(int handle, int field, int *xr, int *yr, int *wr, int *hr);
  30.  
  31. static void toolbar_update(WINDOW *wp, OBJECT *tree, int obj, int depth)
  32. {
  33.     int full[4],area[4],array[4];
  34.     
  35.     if(wp && tree)
  36.     {
  37.         objc_offset(tree,obj,&array[0],&array[1]);
  38.         array[2]=tree[obj].ob_width;
  39.         array[3]=tree[obj].ob_height;
  40.  
  41.         array[0]-=2;
  42.         array[1]-=2;
  43.         array[2]=tree[obj].ob_width+4;
  44.         array[3]=tree[obj].ob_height+4;
  45.  
  46.         wind_update(BEG_UPDATE);
  47.         _wind_get( 0, WF_WORKXYWH,  &full[0], &full[1], &full[2], &full[3]);
  48.         _wind_get(wp->wihandle, WF_FIRSTXYWH, &area[0], &area[1], &area[2], &area[3]);
  49.         while( area[2] && area[3] )
  50.         {
  51.             if(rc_intersect(full,area))
  52.                 if(rc_intersect(array,area))
  53.                     objc_draw(tree,obj,depth,area[0],area[1],area[2],area[3]);
  54.             _wind_get(wp->wihandle, WF_NEXTXYWH,&area[0],&area[1],&area[2],&area[3]);
  55.         }
  56.         wind_update(END_UPDATE);
  57.     }
  58. }
  59.  
  60. void toolbar_do(WINDOW *wp, OBJECT *tree, int x, int y, int bstate, int kstate)
  61. {
  62.     int i,oum,msgbuf[8];
  63.     char *cp;
  64.     extern int gl_apid;
  65.     
  66.    if(wp && tree)
  67.    {
  68.       if((oum=objc_find(tree, ROOT, MAX_DEPTH, x, y))>0) /* null, nicht -1! */
  69.       {
  70.             if((EXOB_TYPE(tree[oum].ob_type) == TABBAR) || (tree[oum].ob_type == G_USERDEF))
  71.             {
  72.                 if(tree[oum].ob_type == G_USERDEF)
  73.                     cp=(char *)((TEDINFO *)tree[oum].ob_spec.userblk->ub_parm)->te_ptext;
  74.                 else
  75.                     cp=tree[oum].ob_spec.tedinfo->te_ptext;
  76.     
  77.                 if(kstate & (K_LSHIFT|K_RSHIFT)) /* Reseten der Tableiste */
  78.                 {
  79.                     if(form_alert(1,Atoolbar[0])==2)
  80.                     {
  81.                         memset(cp,'.',STRING_LENGTH);
  82.     
  83.                         cp[0] = '[';
  84.                         cp[wp->umbruch-2] = ']';
  85.                         cp[STRING_LENGTH] = 0;
  86.                         for(i=1; i<STRING_LENGTH; i++)
  87.                             if( ! (i%wp->tab))
  88.                                 cp[i] = TABSIGN; /*Hütchen im Zeichensatz*/
  89.     
  90.                         cp[STRING_LENGTH] = 0;
  91.                         twp=wp;
  92.                         toolbar_update(wp,tree,oum,1);
  93.                     }
  94.                 }
  95.                 else /* Tabulator setzen/löschen */
  96.                 {
  97.                     i = (x-wp->xwork+wp->wfirst)/wp->wscroll;
  98.                     if( i>0 && i<MAX_LEN-1)
  99.                     {
  100.                         if(bstate==2)
  101.                             cp[i] = DEZTAB;  /* Raute */
  102.                         else
  103.                         {
  104.                             if(cp[i] == '.')
  105.                                 cp[i] = TABSIGN; /* Hütchen */
  106.                             else
  107.                                 cp[i] = '.';
  108.                         }
  109.                         twp=wp;
  110.                         toolbar_update(wp,tree,oum,1);
  111.                     }
  112.                 }
  113.                 return(oum);
  114.             }
  115.  
  116.             if( (tree[oum].ob_flags & SELECTABLE) && 
  117.                !(tree[oum].ob_state & DISABLED))
  118.             {
  119.                 if(EXOB_TYPE(tree->ob_type) == 2) /* neue Buttonversion */
  120.                 {
  121.                     tree[oum-1].ob_flags&=~FLAGS10;
  122.  
  123.                     tree[oum-1].ob_flags|=SELECTABLE;
  124.                     form_button(tree,oum-1,1,&i);
  125.                     toolbar_update(wp,tree,oum-1,MAX_DEPTH);
  126.                     tree[oum-1].ob_flags&=~SELECTABLE;
  127.                 }
  128.                 else
  129.                     form_button(tree,oum,1,&i);
  130.                 
  131.                 if(oum>0)
  132.                 {
  133.                     msgbuf[0]=MN_SELECTED;
  134.                     msgbuf[1]=gl_apid;
  135.                     msgbuf[2]=0;
  136.                     msgbuf[3]=WINFILE;
  137.                     msgbuf[4]=EXOB_TYPE(tree[oum].ob_type);
  138.                     msgbuf[5]=0;
  139.                     msgbuf[6]=0;
  140.                     msgbuf[7]=0;
  141.                     appl_write(gl_apid,16,msgbuf);
  142.                     return(oum);
  143.                 }
  144.             }
  145.       }
  146.    }
  147.    return(FALSE);
  148. }
  149.  
  150. int toolbar_tnormal(WINDOW *wp, OBJECT *tree, int menuitem, int mode)
  151. {
  152.     WORD obj;
  153.     OBJECT *ob;
  154.     
  155.     if(wp && tree)
  156.     {
  157.         obj = 0;
  158.        do
  159.        {
  160.             ob = &tree [++obj];
  161.             if(EXOB_TYPE(ob->ob_type) == menuitem)
  162.             {
  163.                 if(EXOB_TYPE(tree->ob_type) == 2) /* neue Buttonversion  */
  164.                 {
  165.                     if(mode)
  166.                         tree[obj-1].ob_state&=~SELECTED;
  167.                     else
  168.                         tree[obj-1].ob_state|=SELECTED;
  169.                     toolbar_update(wp,tree,obj-1,MAX_DEPTH);
  170. /*
  171.                     if(mode)
  172.                     {
  173.                         objc_change(tree,obj-1,0,tree->ob_x,tree->ob_y,
  174.                                                         tree->ob_width,tree->ob_height,
  175.                                                         tree[obj-1].ob_state&~SELECTED,FALSE);
  176.                     }
  177.                     else
  178.                     {
  179.                         objc_change(tree,obj-1,0,tree->ob_x,tree->ob_y,
  180.                                                         tree->ob_width,tree->ob_height,
  181.                                                         tree[obj-1].ob_state|SELECTED,FALSE);
  182.                     }
  183.                     toolbar_update(wp,tree,obj-1,0);
  184.                     toolbar_update(wp,tree,obj,0);
  185. */
  186.                 }
  187.                 else
  188.                 {
  189.                     if(mode)
  190.                         tree[obj].ob_state&=~SELECTED;
  191.                     else
  192.                         tree[obj].ob_state|=SELECTED;
  193.                     toolbar_update(wp,tree,obj,0);
  194. /*
  195.                     if(mode)
  196.                         objc_change(tree,obj,0,tree->ob_x,tree->ob_y,
  197.                                                         tree->ob_width,tree->ob_height,
  198.                                                         tree[obj].ob_state&~SELECTED,FALSE);
  199.                     else
  200.                         objc_change(tree,obj,0,tree->ob_x,tree->ob_y,
  201.                                                         tree->ob_width,tree->ob_height,
  202.                                                         tree[obj].ob_state|SELECTED,FALSE);
  203.                     toolbar_update(wp,tree,obj,0);
  204. */
  205.                 }
  206.                 return(menuitem);
  207.             }
  208.         } 
  209.         while (! (ob->ob_flags & LASTOB));
  210.     }
  211.     return(0);
  212. }
  213.  
  214. void toolbar_adjust(WINDOW *wp)
  215. {
  216.     WORD obj, type;
  217.     OBJECT *ob;
  218.  
  219.    if(wp && wp->toolbar) /* Toolbar anpassen */
  220.    {
  221.         if(EXOB_TYPE(wp->toolbar->ob_type) == 1) /* senkrecht */
  222.         {
  223.             wp->toolbar->ob_x     =wp->xwork-wp->toolbar->ob_width-wp->wscroll/2;
  224.             wp->toolbar->ob_y     =wp->ywork;
  225.             wp->toolbar->ob_height=wp->hwork;
  226.         }
  227.         else /* waagerecht */
  228.         {
  229.             wp->toolbar->ob_x    =wp->xwork-wp->wscroll/2;
  230.             wp->toolbar->ob_y    =wp->ywork-wp->toolbar->ob_height;
  231.             wp->toolbar->ob_width=wp->wwork+wp->wscroll/2;
  232.  
  233.             obj = 0;
  234.            do 
  235.            {
  236.                 ob    = &wp->toolbar[++obj];
  237.                 if((EXOB_TYPE(ob->ob_type)==TABBAR) ||
  238.                               (ob->ob_type ==G_USERDEF))
  239.                 {
  240.                     ob->ob_width = wp->wwork; /* Weite Anpassen wg. Redraw */
  241.                 }
  242.             } 
  243.             while (! (ob->ob_flags & LASTOB));
  244.         }
  245.    }
  246. }
  247.  
  248. int toolbar_inst(OBJECT *wtree, WINDOW * wp, OBJECT *ttree)
  249. {
  250.     WORD obj, chr, i;
  251.     OBJECT *ob;
  252.     char *cp;
  253.     
  254.     extern int dialbgcolor;
  255.     
  256.     if(wp && wtree && ttree)
  257.     {
  258.         ttree->ob_height++; /* ein Pixel größer */
  259.         obj = 0;
  260.        do 
  261.        {
  262.             ob = &ttree [++obj];
  263.             if((ob->ob_type & 0x00FF) == G_ICON)
  264.             {
  265.                chr = ob->ob_spec.iconblk->ib_char;
  266.                chr &= 0xf000;      /* untere 12 Bits löschen */
  267.                chr |= (dialbgcolor<<8); 
  268.                ob->ob_spec.iconblk->ib_char = chr;
  269.             }
  270.             if(EXOB_TYPE(ob->ob_type) == 0xFF) /* Kennzeichen für Tableiste */
  271.             {
  272.                 cp = (char *)malloc(STRING_LENGTH+1);
  273.                 if(cp)
  274.                 {
  275.                     memset(cp,'.',STRING_LENGTH);
  276.  
  277.                     cp[0] = '[';
  278.                     cp[wp->umbruch-2] = ']';
  279.                     cp[STRING_LENGTH] = 0;
  280.                     for(i=1; i<STRING_LENGTH; i++)
  281.                         if( ! (i%wp->tab))
  282.                             cp[i] = TABSIGN; /*Hütchen im Zeichensatz*/
  283.  
  284.                     cp[STRING_LENGTH] = 0;
  285.  
  286.                     ob->ob_spec.tedinfo->te_ptext  = cp;
  287.                     ob->ob_spec.tedinfo->te_ptmplt = cp;
  288.                     ob->ob_spec.tedinfo->te_pvalid = cp;
  289.                     ob->ob_x += wp->wscroll/2;
  290.                     ob->ob_width = wp->wwork;
  291.                     ob->ob_spec.tedinfo->te_txtlen = STRING_LENGTH-1;
  292.                     wp->tabbar = ob;
  293.  
  294.                     /* als benutzerdefiniertes Objekt zeichenen lassen */
  295.                     tabbar_fix(wp);
  296.                 }
  297.                 if(!tabbar)
  298.                 {    /* verstecken und Höhe verringern */
  299.                     ob->ob_flags |= HIDETREE;
  300.                     ttree->ob_height -= ob->ob_height;
  301.                     wp->tabbar = NULL;
  302.                 }
  303.             }
  304.         } 
  305.         while (! (ob->ob_flags & LASTOB));
  306.     }
  307.     return(TRUE);
  308. }
  309.  
  310. void tabbar_inst(WINDOW *wp, int selected)
  311. {
  312.     OBJECT *ob;
  313.     int obj;
  314.     
  315.     extern int toolbar_zeigen;
  316.         
  317.     if(wp && wp->toolbar /*&& !toolbar_senkrecht*/)
  318.     {
  319.         obj = 0;
  320.        do
  321.        {
  322.             ob    = &wp->toolbar[++obj];
  323.             if((EXOB_TYPE(ob->ob_type)==TABBAR) ||
  324.                           (ob->ob_type ==G_USERDEF))
  325.             {
  326.                 if(selected && !tabbar)
  327.                 {    /* aufdecken und Höhe vergrößern */
  328.                     ob->ob_flags &= ~HIDETREE;
  329.                     wp->toolbar->ob_height += ob->ob_height;
  330.                     _wind_get(wp->wihandle,WF_WORKXYWH,&wp->xwork,&wp->ywork,&wp->wwork,&wp->hwork);
  331.                     form_dial(FMD_FINISH,0,0,0,0,
  332.                         wp->xwork-wp->wscroll/2,wp->ywork-wp->toolbar->ob_height,
  333.                         wp->wwork+wp->wscroll/2,wp->hwork+wp->toolbar->ob_height);
  334.                     wp->tabbar = ob;
  335.                 }
  336.                 if(!selected && tabbar)
  337.                 {    /* verstecken und Höhe verringern */
  338.                     ob->ob_flags |= HIDETREE;
  339.                     wp->toolbar->ob_height -= ob->ob_height;
  340.                     _wind_get(wp->wihandle,WF_WORKXYWH,&wp->xwork,&wp->ywork,&wp->wwork,&wp->hwork);
  341.                     form_dial(FMD_FINISH,0,0,0,0,
  342.                         wp->xwork-wp->wscroll/2,wp->ywork-wp->toolbar->ob_height,
  343.                         wp->wwork+wp->wscroll/2,wp->hwork+wp->toolbar->ob_height);
  344.                     wp->tabbar = NULL;
  345.                 }
  346.                 break;
  347.             }
  348.         } 
  349.         while (! (ob->ob_flags & LASTOB));
  350.     }
  351. }
  352.  
  353. hndl_mm1(OBJECT *tree, int mx, int my)
  354. {
  355.     WINDOW *wp;
  356.     OBJECT *ob;
  357.     int obj;
  358.   
  359.     static char infostr[31] = "";
  360.     static int lastobj = -1;
  361.   
  362.     wp = Wgettop();
  363.     if(wp && wp->toolbar && (wp->kind & INFO))
  364.     {
  365.         if((obj=objc_find(wp->toolbar, 0, MAX_DEPTH, mx, my))>0)
  366.         {
  367.             ob = &wp->toolbar[obj];
  368.             if(obj != lastobj)
  369.             {
  370.                 if(EXOB_TYPE(ob->ob_type)>0 && 
  371.                     EXOB_TYPE(ob->ob_type)<TABBAR) /* nicht bei Tabbar */
  372.                 {
  373.                     strcpy(infostr, &((char *)tree[EXOB_TYPE(ob->ob_type)].ob_spec.index)[1]);
  374.                     wind_set(wp->wihandle,WF_INFO,infostr);
  375.                     strcpy(wp->info, infostr);
  376.                     lastobj = obj;
  377.                 }
  378.             }
  379.  
  380.             if((EXOB_TYPE(ob->ob_type)==TABBAR) ||
  381.                          (ob->ob_type ==G_USERDEF))
  382.             {
  383.                 sprintf(infostr," Tab: %ld",(mx-wp->xwork+wp->wfirst)/wp->wscroll+1);
  384.                 wind_set(wp->wihandle,WF_INFO,infostr);
  385.                 strcpy(wp->info, infostr);
  386.                 lastobj = obj;
  387.             }
  388.  
  389.         }
  390.     }
  391. }
  392.  
  393. int Wgetnexttab(WINDOW *wp)
  394. {
  395.     int i;
  396.     char *cp;
  397.     long abscol;
  398.     
  399.     if(wp && wp->toolbar && wp->tabbar)
  400.     {
  401.         abscol=wp->col+wp->wfirst/wp->wscroll; /* absolute position */
  402.         
  403.         if(wp->tabbar->ob_type==G_USERDEF)
  404.             cp=(char *)((TEDINFO *)wp->tabbar->ob_spec.userblk->ub_parm)->te_ptext;
  405.         else
  406.             cp=wp->tabbar->ob_spec.tedinfo->te_ptext;
  407.         
  408.         for(i=abscol+1; i<STRING_LENGTH; i++)
  409.             if((cp[i] == TABSIGN) || (cp[i] == DEZTAB))
  410.                 return(i-abscol);
  411.     }
  412.     return(0);
  413. }
  414.  
  415. int Wgetprevtab(WINDOW *wp)
  416. {
  417.     int i;
  418.     char *cp;
  419.     long abscol;
  420.  
  421.     if(wp && wp->toolbar && wp->tabbar)
  422.     {
  423.         abscol=wp->col+wp->wfirst/wp->wscroll; /* absolute position */
  424.         
  425.         if(wp->tabbar->ob_type==G_USERDEF)
  426.             cp=(char *)((TEDINFO *)wp->tabbar->ob_spec.userblk->ub_parm)->te_ptext;
  427.         else
  428.             cp=wp->tabbar->ob_spec.tedinfo->te_ptext;
  429.         
  430.         for(i=abscol-1; i>=0; i--)
  431.             if((cp[i] == TABSIGN) || (cp[i] == DEZTAB))
  432.                 return(abscol-i);
  433.     }
  434.     return(0);
  435. }
  436.  
  437. char Wgettab(WINDOW *wp)
  438. {
  439.     char *cp;
  440.     long abscol;
  441.     
  442.     if(wp && wp->toolbar && wp->tabbar)
  443.     {
  444.         abscol=wp->col+wp->wfirst/wp->wscroll; /* absolute position */
  445.         
  446.         if(wp->tabbar->ob_type==G_USERDEF)
  447.             cp=(char *)((TEDINFO *)wp->tabbar->ob_spec.userblk->ub_parm)->te_ptext;
  448.         else
  449.             cp=wp->tabbar->ob_spec.tedinfo->te_ptext;
  450.         
  451.         return(cp[abscol]);
  452.     }
  453.     return('.');
  454. }
  455.  
  456. void Wtabbarupdate(WINDOW *wp)
  457. {
  458.     WORD obj, type;
  459.     OBJECT *ob;
  460.     static int old = 0;
  461.  
  462.     if(wp && 
  463.         wp->toolbar && 
  464.         wp->tabbar && 
  465.         ( (wp->wfirst/wp->wscroll != old)) || FALSE
  466.           /*((char *)((TEDINFO *)wp->tabbar->ob_spec.userblk->ub_parm)->te_ptext[wp->umbruch-2] != ']')*/
  467.         )
  468.     {
  469.         obj = 0;
  470.        do 
  471.        {
  472.             ob    = &wp->toolbar[++obj];
  473.             if((EXOB_TYPE(ob->ob_type)==TABBAR) ||
  474.                           (ob->ob_type ==G_USERDEF))
  475.             {
  476.                 twp=wp;
  477.                 toolbar_update(wp,wp->toolbar,obj,1);
  478.                 old = wp->wfirst/wp->wscroll;
  479.             }
  480.         } 
  481.         while (! (ob->ob_flags & LASTOB));
  482.     }
  483. }
  484.